/*
 * @Description: 重写数组的7个方法
 * @Author: wangqi
 * @Date: 2021-05-23 16:31:08
 * @LastEditTime: 2021-05-31 22:24:04
 */
import { def } from './utils'

const arrayMethods = Object.create(Array.prototype);
const methodsNeedChange = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];


methodsNeedChange.forEach((methodName) => {
    // 缓存原始方法
    const original = arrayMethods[methodName];
    // 重写数组的7个方法
    def(arrayMethods, methodName, function (...res) {
        // 数组原来本身的功能
        const result = original.apply(this, res);

        // 数组实例身上的 __ob__ 属性, 用来处理后续动态添加的数组,让其也变成响应式
        // Vue.$set() 这一层暂未实现
        const ob = this.__ob__;

        let inserted;
        switch (methodName) {
            case 'push':
            case 'unshift':
                inserted = res;
                break;
            case 'splice':
                inserted = res.slice(2);
                break;
        };

        // 说明是新增的值,也要成为响应式
        if (inserted) {
            ob.observeArray(inserted);
        }

        // dep通知数组更新
        ob.dep.notify();

        return result;
    }, false);

});

export { arrayMethods };
